package com.jiarong.proxy.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * JDK动态代理
 *
 * @author 加绒
 * @date 2021/10/19 10:36
 */
public class JdkProxyTest {
    public static void main(String[] args) {
        // 创建目标对象
        Target target = new Target();
        // 获得增强对象
        Advice advice = new Advice();
        // 生成动态代理对象
        TargetInterface proxy = (TargetInterface) Proxy.newProxyInstance(
                // 目标对象类加载器
                target.getClass().getClassLoader(),
                // 目标对象相同的接口字节码数组
                target.getClass().getInterfaces(),
                // 调用代理对象的任何方法，本质都是执行invoke方法
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        // 执行前置增强方法
                        advice.before();
                        // 执行目标方法
                        Object invoke = method.invoke(target, args);
                        // 执行后置增强方法
                        advice.after();
                        return invoke;
                    }
                }
        );
        // 调用动态代理对象方法
        proxy.save();
    }
}
